#!/bin/bash
###
# @Author: dvlproad dvlproad@163.com
# @Date: 2023-02-27 21:38:10
 # @LastEditors: dvlproad
 # @LastEditTime: 2023-08-06 19:06:37
# @FilePath: /AutoPackage-CommitInfo/bulidScriptCommon/upload/upload_result_log.sh
# @Description: 上传结束的各种log获取方法
###
# source ./upload_result_log.sh
# getUpdateLog_all -envInfoF "${ENVIRONMENT_FILE_PATH}" -comScriptHomeDir "${COMMON_SCRIPT_HOME_DIR_Absolute}"  --update-log-use-type "Notification"
# getUpdateLog_all -envInfoF "../example_packing_info/app_info.json" -comScriptHomeDir "../bulidScriptCommon"  --update-log-use-type "Notification"

# # 当前【shell脚本】的工作目录
# # $PWD代表获取当前路径，当cd后，$PWD也会跟着更新到新的cd路径。这个和在终端操作是一样的道理的
# CurrentDIR_Script_Absolute="$( cd "$( dirname "$0" )" && pwd )"
# #echo "CurrentDIR_Script_Absolute=${CurrentDIR_Script_Absolute}"
# #bulidScriptCommon_dir_Absolute=${CurrentDIR_Script_Absolute}/..
# bulidScriptCommon_dir_Absolute=${CurrentDIR_Script_Absolute%/*} # 使用此方法可以避免路径上有..
# echo "bulidScriptCommon_dir_Absolute=${bulidScriptCommon_dir_Absolute}"

# # 创建一个空数组
# array=()

# # 添加单个元素
# array+=("element1")

# # 添加多个元素
# array+=("element2" "element3" "element4")

# # 或者
# new_elements=("element2" "element3" "element4")
# array+=("${new_elements[@]}")


JQ_EXEC=$(which jq)

# 定义颜色常量
NC='\033[0m' # No Color
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'

# 当前【shell脚本】的工作目录
# $PWD代表获取当前路径，当cd后，$PWD也会跟着更新到新的cd路径。这个和在终端操作是一样的道理的
CurrentDIR_Script_Absolute="$( cd "$( dirname "$0" )" && pwd )"
#echo "CurrentDIR_Script_Absolute=${CurrentDIR_Script_Absolute}"
#CommonFun_HomeDir_Absolute2=${CurrentDIR_Script_Absolute}/..
CommonFun_HomeDir_Absolute2=${CurrentDIR_Script_Absolute%/*} # 使用此方法可以避免路径上有..
CommonFun_HomeDir_Absolute=${CommonFun_HomeDir_Absolute2%/*}

qscript_path_get_filepath="${CommonFun_HomeDir_Absolute}/qscript_path_get.sh"
update_json_file_python_path="$(sh ${qscript_path_get_filepath} qbase py_update_json_file)"


# 读取input.json文件内容
FILE_PATH=${CurrentDIR_Script_Absolute}/test_data_notification.json

key1="branch_info_result.Notification.current.slice"
key2="branch_info_result.Notification.lastOnline.slice"
array=()
array1=$(cat ${FILE_PATH} | ${JQ_EXEC} ".${key1}[]")
array+=("${array1[@]}")
array2=$(cat ${FILE_PATH} | ${JQ_EXEC} ".${key2}[]")
array+=("${array2[@]}")
# echo "${array[@]}"


UpdateJsonKey="branch_info_result.Notification.all.slice"
UpdateJsonKeyValue="${array[@]}"

FileName=${FILE_PATH##*/} # 取最后的component
#echo "FileName=${FileName}"
FileType=${FileName##*.}
FileNameNoType=${FileName%%.*}
#echo "FileNameNoType=${FileNameNoType}, FileType=${FileType}"
FilePath_temp="${FileNameNoType}_temp.${FileType}"
#echo "FilePath_temp=${FilePath_temp}"
#echo "更新本次打包的内容到项目外和项目内，便于下次检查"
cat /dev/null > ${FilePath_temp} # 清空文件内容
# echo "${array[@]}" > ${FilePath_temp} # 清空文件内容
#echo "开始执行①对${FILE_PATH}的内容添加 ${UpdateJsonKey} 属性的值，并在添加后输出到 ${FilePath_temp} 文件中"



# cat ${FILE_PATH} |
#       jq --arg     objectName "${UpdateJsonKey}" \
#          --argjson jsonString "${UpdateJsonKeyValue}" \
#         '.branch_info_result.Notification.all.slice = $jsonString' >> ${FilePath_temp}   # 这是覆盖，用=，不用+=


# #echo "开始执行②删除${FILE_PATH}的内容，并将之前创建的 ${FilePath_temp} 文件的内容复制给它，以达到更新的目的"
# cat /dev/null > ${FILE_PATH}
# cat "${FilePath_temp}" >> ${FILE_PATH} # FilePath_temp 加引号，避免名称中有空格，导致的错误
# rm -f ${FilePath_temp}

function debug_log() {
    if [ "${isRelease}" == true ]; then
        echo "$1"
    fi
}

# 对当前的①截断数组字符串和②待截断的字符串，进行添加JSON文件中指定的key的值，得到新的①截断数组字符串和②待截断的字符串
function getNewByDealCurrentWithAdd() {
    # shell 参数具名化
    show_usage="args: [-wait, -current, -jsonF, -k]\
                                      [--wait-intercept-string=, --current-no-bracket-array-string=, --json-file=, --array-key=]"

    while [ -n "$1" ]; do
        case "$1" in
        -wait | --wait-intercept-string)
            intercept_updateContentString=$2
            shift 2
            ;;
        -current | --current-no-bracket-array-string)
            intercept_SLICE_STRING_ARRAY_ONLY_STRING=$2
            shift 2
            ;;
        -jsonF | --json-file)
            RESULT_SALE_TO_JSON_FILE_PATH=$2
            shift 2
            ;;
        -k | --array-key)
            SLICE_STRING_ARRAY_KEY=$2
            shift 2
            ;;
        -isLast | --is-last-append)
            IS_LAST_APPEND=$2
            shift 2
            ;; # 是否是最后的拼接，如果拼接结束，不管是否超过长度，都将待处理的作为最终结果
        --) break ;;
        *)
            echo $1,$2,$show_usage
            break
            ;;
        esac
    done

    if [ ! -f "${RESULT_SALE_TO_JSON_FILE_PATH}" ]; then
        echo "${RED}要添加哪个文件不能为空${NC}\n"
        return 1
    fi

    

    if [ -z "${SLICE_STRING_ARRAY_KEY}" ]; then
        printf "${RED}❌Error:要取文件中哪个key的值 SLICE_STRING_ARRAY_KEY=${SLICE_STRING_ARRAY_KEY} 不能为空，请检查。${NC}\n"
        return 1
    fi

    if [ -z "${IS_LAST_APPEND}" ]; then
        printf "${RED}❌Error:是否是最后一次拼接的入参不能不填，否则无法正常结束。(①需要作为结束标记；②需要对结束时候删除最后尾部的逗号)。${NC}\n"
        return 1
    fi
    if [ "${IS_LAST_APPEND}" != "true" ] && [ "${IS_LAST_APPEND}" != "false" ]; then
        printf "${RED}❌Error:IS_LAST_APPEND 值只能为 true 或 false, 请检查！${NC}\n"
        return 1
    fi

    NEW_WAIT_INTERCEPT_STRING=${intercept_updateContentString}
    NEW_OK_INTERCEPT_SLICE_STRING=${intercept_SLICE_STRING_ARRAY_ONLY_STRING}
    # echo "=====截取带拼接的前①如下：NEW_OK_INTERCEPT_SLICE_STRING=${NEW_OK_INTERCEPT_SLICE_STRING}"
    # echo "=====截取带拼接前②如下：NEW_WAIT_INTERCEPT_STRING=${NEW_WAIT_INTERCEPT_STRING}"

    echo "测试输出结果命令：《cat ${RESULT_SALE_TO_JSON_FILE_PATH} | ${JQ_EXEC} \".${SLICE_STRING_ARRAY_KEY}|length\"》"
    contentCount=$(cat ${RESULT_SALE_TO_JSON_FILE_PATH} | ${JQ_EXEC} ".${SLICE_STRING_ARRAY_KEY}|length")
    # echo "--------contentCount=${contentCount}"
    if [ "${contentCount}" == 0 ]; then
        echo "友情提示💡💡💡：${SLICE_STRING_ARRAY_KEY}没有内容"
        return 1
    fi

    for ((i = 0; i < contentCount; i++)); do
        iContent=$(cat ${RESULT_SALE_TO_JSON_FILE_PATH} | ${JQ_EXEC} ".${SLICE_STRING_ARRAY_KEY}" | ${JQ_EXEC} ".[${i}]")
        iContent_noQuote=${iContent:1:${#iContent}-2} # 去除前后的双引号,方便添加或修改
        # echo "--------iContent_noQuote=${iContent_noQuote}"

        newTextLength=$((${#NEW_WAIT_INTERCEPT_STRING} + ${#iContent_noQuote} + 1))
        # echo "--------如果添加新文本后 NEW_WAIT_INTERCEPT_STRING 长度会变为${newTextLength}"
        if [ ${newTextLength} -lt 2048 ]; then #企业微信通知最大长度为4096
            # 没超过长度限制的话，可以一直添加
            NEW_WAIT_INTERCEPT_STRING="${NEW_WAIT_INTERCEPT_STRING}${iContent_noQuote}\n"
        else
            # 超过长度限制的话，先把当前可以截断的保存下来。然后本次的这个就作为新的值,然后继续找下一个是否可以也拼起来
            echo "-----------------------长度超过限制了-----------------------"
            NEW_OK_INTERCEPT_SLICE_STRING+="\"${NEW_WAIT_INTERCEPT_STRING}\","
            NEW_WAIT_INTERCEPT_STRING="${iContent_noQuote}\n"
        fi
    done

    if [ "${IS_LAST_APPEND}" == "true" ]; then
        debug_log "💡💡💡友情提示：这是最后一次拼接，将不管是否超过长度，都将待处理的作为最终结果。附待处理值NEW_WAIT_INTERCEPT_STRING=${NEW_WAIT_INTERCEPT_STRING}"
        NEW_OK_INTERCEPT_SLICE_STRING+="\"${NEW_WAIT_INTERCEPT_STRING}\","
        NEW_WAIT_INTERCEPT_STRING=""

        # ①先清理冗余值
        # 去除最后一个字符,即逗号","
        if [ -n "${NEW_OK_INTERCEPT_SLICE_STRING}" ]; then
            NEW_OK_INTERCEPT_SLICE_STRING=${NEW_OK_INTERCEPT_SLICE_STRING:0:${#NEW_OK_INTERCEPT_SLICE_STRING}-1}
        fi
    fi

    # echo "=====截取带拼接的结果:IS_LAST_APPEND=${IS_LAST_APPEND}"
    # echo "=====截取带拼接的结果①如下：NEW_OK_INTERCEPT_SLICE_STRING=${NEW_OK_INTERCEPT_SLICE_STRING}"
    # echo "=====截取带拼接的结果②如下：NEW_WAIT_INTERCEPT_STRING=${NEW_WAIT_INTERCEPT_STRING}"
    # if [ "${IS_LAST_APPEND}" == "true" ]; then
    #     logResutValue "${CYAN}>>>>>>友情提示，添加后，【最新的所有信息】如下>>>>>>\n${BLUE}${NEW_OK_INTERCEPT_SLICE_STRING}${NC}\n${CYAN}<<<<<<友情提示，添加后，【最新的所有信息】如上<<<<<<${NC}"
    # else
    #     logResutValue "${CYAN}>>>>>>友情提示，添加后，【临时的所有信息】如下>>>>>>\n${BLUE}${NEW_WAIT_INTERCEPT_STRING}${NC}\n${CYAN}<<<<<<友情提示，添加后，【临时的所有信息】如上<<<<<<${NC}"
    # fi
}


function logResutValue() {
    # ❌错误方法：使用echo无法正确输出值
    # echo "=============${escaped_value//\\/\\\\}============="

    # ✅正确方法：使用先存到file，再从file中打印
    local now_time=$(date +"%m%d%H%M%S")
    TempDir_Absolute="$( cd "$( dirname "$0" )" && pwd )"
    local temp_file_abspath="${TempDir_Absolute}/${now_time}.json"

    echo $1 > ${temp_file_abspath} # 创建文件，并写入内容到该文件。如果该文件已经存在，则会覆盖原有内容。
    cat ${temp_file_abspath}

    # 删除文件temp_file_abspath
    rm -rf ${temp_file_abspath}
}


RESULT_SALE_TO_JSON_FILE_PATH=$FILE_PATH
HEADER_SLICE_STRING_ARRAY_KEY="branch_info_result.Notification.header.slice"
getNewByDealCurrentWithAdd -wait "${intercept_updateContentString}" -current "${intercept_SLICE_STRING_ARRAY_ONLY_STRING}" -jsonF "${RESULT_SALE_TO_JSON_FILE_PATH}" -k "${HEADER_SLICE_STRING_ARRAY_KEY}" --is-last-append "false"
intercept_updateContentString="${NEW_WAIT_INTERCEPT_STRING}"
intercept_SLICE_STRING_ARRAY_ONLY_STRING="${NEW_OK_INTERCEPT_SLICE_STRING}"
logResutValue "${CYAN}>>>>>>友情提示，添加 header 后，【临时的所有信息】如下>>>>>>\n${BLUE}${NEW_WAIT_INTERCEPT_STRING}${NC}\n${CYAN}<<<<<<友情提示，添加 header 后，【临时的所有信息】如上<<<<<<${NC}"


BOTTOM_SLICE_STRING_ARRAY_KEY="branch_info_result.Notification.bottom.slice"
debug_log "正在执行方法(截取带拼接的字符串 bottom):《 ${BLUE}getNewByDealCurrentWithAdd -wait \"${intercept_updateContentString}\" -current \"${intercept_SLICE_STRING_ARRAY_ONLY_STRING}\" -jsonF \"${RESULT_SALE_TO_JSON_FILE_PATH}\" -k \"${BOTTOM_SLICE_STRING_ARRAY_KEY}\" --is-last-append \"ture\" ${NC}》${NC}"
getNewByDealCurrentWithAdd -wait "${intercept_updateContentString}" -current "${intercept_SLICE_STRING_ARRAY_ONLY_STRING}" -jsonF "${RESULT_SALE_TO_JSON_FILE_PATH}" -k "${BOTTOM_SLICE_STRING_ARRAY_KEY}" --is-last-append "true"
intercept_updateContentString="${NEW_WAIT_INTERCEPT_STRING}"
intercept_SLICE_STRING_ARRAY_ONLY_STRING="${NEW_OK_INTERCEPT_SLICE_STRING}"
logResutValue "${CYAN}>>>>>>友情提示，添加 bottom 后，【最新的所有信息】如下>>>>>>\n${BLUE}${NEW_OK_INTERCEPT_SLICE_STRING}${NC}\n${CYAN}<<<<<<友情提示，添加 bottom 后，【最新的所有信息】如上<<<<<<${NC}"



# 4、保存值
# intercept_SLICE_STRING_ARRAY_ONLY_STRING="123"

# ②正式保存至
intercept_SLICE_STRING_ARRAY_KEY="branch_info_result.Notification.all.intercept"

# 保存的方法1：
Escape_UPDATECONTENT_ARRAY_brackets_STRING="[${intercept_SLICE_STRING_ARRAY_ONLY_STRING}]" # 内部已符合转义并加了逗号,现在补充上前后的[]
debug_log "正在执行命令(保留各个值):《 sh ${CommonFun_HomeDir_Absolute}/update_json_file.sh -f \"${RESULT_SALE_TO_JSON_FILE_PATH}\" -sk \"${intercept_SLICE_STRING_ARRAY_KEY}\" -sv \"${Escape_UPDATECONTENT_ARRAY_brackets_STRING}\" --skip-value-check \"true\" 》"
sh ${CommonFun_HomeDir_Absolute}/update_json_file.sh -f "${RESULT_SALE_TO_JSON_FILE_PATH}" -sk "${intercept_SLICE_STRING_ARRAY_KEY}" -sv "${Escape_UPDATECONTENT_ARRAY_brackets_STRING}" --skip-value-check "true"
if [ $? != 0 ]; then
    echo "$FUNCNAME ❌更新打包结果的尾部字符串数组到文件中，错误啦2。。。。。。"
    return 1
fi

# 保存的方法2：
# echo "${YELLOW}正在执行命令(保留各个值):《 ${BLUE}python3 ${update_json_file_python_path} -jsonF \"${RESULT_SALE_TO_JSON_FILE_PATH}\" -k \"${intercept_SLICE_STRING_ARRAY_KEY}\" -v \"${intercept_SLICE_STRING_ARRAY_ONLY_STRING}\" ${YELLOW}》${NC}"
python3 ${update_json_file_python_path} -jsonF "${RESULT_SALE_TO_JSON_FILE_PATH}" -k "${intercept_SLICE_STRING_ARRAY_KEY}" -v "${intercept_SLICE_STRING_ARRAY_ONLY_STRING}"
if [ $? != 0 ]; then
    echo "❌Error:更新失败"
    return 1
fi

logSuccessMsg "恭喜:您获取到并保存到文件的最后所有数据在进行截断处理后(.all.intercept)markdown:${shouldMarkdown}的 ${PURPLE}.${intercept_SLICE_STRING_ARRAY_KEY} ${GREEN}值(在 ${BLUE}${RESULT_SALE_TO_JSON_FILE_PATH} ${GREEN}文件中)如下:"
cat ${RESULT_SALE_TO_JSON_FILE_PATH} | jq ".${intercept_SLICE_STRING_ARRAY_KEY}" | jq '.'


